import "./style.css"; import style from "./style.module.css"; import dateformat from "dateformat"; import { AnimeLoader, AnimeLoaderData } from "../../../util/animeLoader"; import Link from "next/link"; dateformat.i18n.dayNames = [ '日', '月', '火', '水', '木', '金', '土', '日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日' ]; type PageType = { searchParams: Record, params: { animeId: string, } } export async function generateMetadata(context: PageType) { const loadedData = await AnimeLoader.instance.loadData().then(d => { const r = d.find(a => a.animeId == Number(context.params.animeId))!; return r; }); return { title: `アキバ総研アーカイブ:アニメ : ${loadedData.title}`, } } export default async function Page(context: PageType) { const loadedData = await AnimeLoader.instance.loadData().then(d => { const r = d.find(a => a.animeId == Number(context.params.animeId))!; return r; });; return (

アニメ詳細

タイトル: {loadedData.title}
主カテゴリ: {loadedData.primaryCategory}
開始時期: {loadedData.startSeason}
アキバ総研のアニメ個別URL: 公式 IA検索結果 IAをiframe
{titleReviewScore(loadedData.titleReviewScore)} {titleReviewList(loadedData.animeId, loadedData.titleReviewList)} {titleHitokotoList(loadedData.titleHitokotoList)} {episodeList(loadedData.episodeList)} {episodeHitokotoList(loadedData.episodeHitokotoList)}
); } /** 作品自体のレビューの点数 */ function titleReviewScore(titleReviewScore: AnimeLoaderData["titleReviewScore"]) { return ( <>

作品レビュー

ストーリー: {titleReviewScore.story ?? "なし"}
作画: {titleReviewScore.sakuga ?? "なし"}
キャラクター: {titleReviewScore.character ?? "なし"}
音楽: {titleReviewScore.music ?? "なし"}
オリジナリティ: {titleReviewScore.originality ?? "なし"}
演出: {titleReviewScore.storyboard ?? "なし"}
声優: {titleReviewScore.voice ?? "なし"}
歌: {titleReviewScore.song ?? "なし"}
満足度: {titleReviewScore.manzokudo ?? "なし"}
); } function titleReviewList(animeId: number, list: AnimeLoaderData["titleReviewList"]) { // レビューの一覧 const PPV = 20; const reviewListLinks: JSX.Element[] = []; for (let i = 0; i < Math.ceil(list.length / PPV); i++) { const itemFrom = (i * PPV) + 1; const itemTo = Math.min(itemFrom + PPV - 1, list.length); if (i == 0) { // 1ページ目 reviewListLinks.push(

レビュー自体の一覧

) reviewListLinks.push(
新着 {itemFrom}~{itemTo}件目 公式 IA検索結果 IAをiframe
); } else { // 2ページ目移行 const page = i + 1; reviewListLinks.push(
新着 {itemFrom}~{itemTo}件目 公式 IA検索結果 IAをiframe
); } } const reviewList: JSX.Element[] = []; if (0 < list.length) { reviewList.push(

個別のレビュー一覧

) reviewList.push(レビューの一覧だとネタバレのレビューが表示されないので、個別のレビューのリンクを作成します) for (const v of list) { const timestampStr = dateformat(new Date(v.timestampSec * 1000), "yyyy/mm/dd(ddd)HH:MM:ss"); const index = list.indexOf(v); reviewList.push(
{index + 1}/{list.length} 公式 IA検索結果 IAをiframe 投稿日時:{timestampStr} スコア:{v.score} ネタバレ:{v.isSpoiler ? "はい" : "いいえ"} 投稿者:{v.userName}
); } } return (<>

作品のレビュー一覧( {list.length} 件 )

{reviewListLinks} {reviewList} ); } function titleHitokotoList(list: AnimeLoaderData["titleHitokotoList"]) { const hitokotoList: JSX.Element[] = []; if (0 < list.length) { hitokotoList.push(
ヒトコトは個別のURLが無いので必要最低限のみテキストを転載します
) for (const h of list) { const timestampStr = dateformat(new Date(h.timestampSec * 1000), "yyyy/mm/dd(ddd)HH:MM:ss") const index = list.indexOf(h); hitokotoList.push(
{index + 1}/{list.length} {timestampStr} {h.reviewHtml}
) } } return (<>

作品のヒトコト一覧( {list.length} 件 )

{hitokotoList} ); } function episodeList(list: AnimeLoaderData["episodeList"]) { const episodeElementList: JSX.Element[] = []; if (0 < list.length) { for (const e of list) { const index = list.indexOf(e); episodeElementList.push(
{index + 1}/{list.length} 「{e.subTitle}」 ヒトコト数:{e.reviewCount} スコア:{e.score ?? "なし"}
) } } return (<>

作品のエピソード ( {list.length} 件 )

{episodeElementList} ); } function episodeHitokotoList(list: AnimeLoaderData["episodeHitokotoList"]) { const hitokotoList: JSX.Element[] = []; const totalHitokotoCount = list.map(h => h.hitokotoList.length).reduce((a, b) => a + b, 0) if (0 < list.length) { hitokotoList.push(
ヒトコトは個別のURLが無いので必要最低限のみテキストを転載します
) let index = 0; for (const e of list) { index += 1; for (const h of e.hitokotoList) { const timestampStr = dateformat(new Date(h.timestampSec * 1000), "yyyy/mm/dd(ddd)HH:MM:ss") hitokotoList.push(
{index}/{totalHitokotoCount} 第{e.episodeId}話のヒトコト. {timestampStr} {h.reviewHtml}
) } } } return (<>

作品のエピソードごとのヒトコト ( {totalHitokotoCount} 件 )

{hitokotoList} ); } export async function generateStaticParams() { const loadedData = await AnimeLoader.instance.loadData(); return loadedData.map(c => { return { animeId: String(c.animeId) }; }) satisfies PageType["params"][]; }